package frame.laxcen.request;

import frame.laxcen.util.FrameWriter;
import frame.util.ByteArrayUtil;
import frame.util.ByteUtil;

public class Request_0010_11 implements IRequest {

    public final byte[] FrameBytes;

    public Request_0010_11(RequestTemplate template) {

        FrameWriter w = FrameWriter.instance(this.getClass());

        w.writeU8(template.AntennaFlag);

        w.writeU8(template.Area);

        w.writeU16(ByteUtil.bytePairToShort(template.Address_H, template.Address_L));

        w.writeU8s(template.Content);

        if(template.hasParam_0x01()) {

            w.writeP8s((byte) 0x01, ByteArrayUtil.concat(new byte[] {

                    template.Pid_0x01_0, template.Pid_0x01_1, template.Pid_0x01_2, template.Pid_0x01_3

            }, template.Pid_0x01_4_to_n));
        }

        if(template.hasParam_0x02()) {

            w.writeP32((byte) 0x02, template.Pid_0x02_0);

            w.writeU32(template.Pid_0x02_1);

            w.writeU32(template.Pid_0x02_2);

            w.writeU32(template.Pid_0x02_3);
        }

        if(template.hasParam_0x03()) {

            w.writeP8((byte) 0x03, template.Pid_0x03_0);
        }

        this.FrameBytes = w.toByteArray();
    }

    @Override
    public byte[] getFrameBytes() {

        return FrameBytes;
    }

    public static class RequestTemplate {

        // 天线端口

        // bit位 0 - 4 对应 天线 1 - 4
        // 置 1 时为使用该天线

        public byte AntennaFlag = (byte) 0b1111;

        // 数据区

        // 0 -> 写入保留区
        // 1 -> 写入EPC区
        // 2 -> TID区
        // 3 -> 写入用户数据区

        public byte Area = (byte) 0x03;

        // 写地址

        public byte Address_H = (byte) 0x0;

        public byte Address_L = (byte) 0x0;

        // 数据内容

        public byte[] Content = new byte[0];

        // 写入的标签内容需要匹配的参数

        // 0 -> 匹配的数据区 1.EPC 2.TID 3. 用户数据区
        // 1 -> 地址 高8位
        // 2 -> 地址 低8位
        // 3 -> 需要匹配的数据的位长度 即bit长度 Byte是8位的
        // 4 to n -> 需要匹配的数据内容

        public Byte Pid_0x01_0;

        public Byte Pid_0x01_1;

        public Byte Pid_0x01_2;

        public Byte Pid_0x01_3;

        public byte[] Pid_0x01_4_to_n;

        // 标签访问密码

        // 四位 U32

        public Integer Pid_0x02_0;

        public Integer Pid_0x02_1;

        public Integer Pid_0x02_2;

        public Integer Pid_0x02_3;

        // 块写参数

        // 0 -> 采用块写
        // 1 -> 不采用块写

        public Byte Pid_0x03_0;

        public boolean hasParam_0x01() {

            if(Pid_0x01_0 == null) return false;

            if(Pid_0x01_1 == null) return false;

            if(Pid_0x01_2 == null) return false;

            if(Pid_0x01_3 == null) return false;

            if(Pid_0x01_4_to_n == null) return false;

            return true;
        }

        public boolean hasParam_0x02() {

            if(Pid_0x02_0 == null) return false;

            if(Pid_0x02_1 == null) return false;

            if(Pid_0x02_2 == null) return false;

            if(Pid_0x02_3 == null) return false;

            return true;
        }

        public boolean hasParam_0x03() {

            if(Pid_0x03_0 == null) return false;

            return true;
        }

        // 配置使用天线1进行写操作
        public RequestTemplate useAntenna_1() {

            this.AntennaFlag |= 1;

            return this;
        }

        // 配置使用天线2进行写操作
        public RequestTemplate useAntenna_2() {

            this.AntennaFlag |= (1 << 1);

            return this;
        }

        // 配置使用天线3进行写操作
        public RequestTemplate useAntenna_3() {

            this.AntennaFlag |= (1 << 2);

            return this;
        }

        // 配置使用天线4进行写操作
        public RequestTemplate useAntenna_4() {

            this.AntennaFlag |= (1 << 3);

            return this;
        }

        // 配置匹配写 匹配UserData 地址为0 16个Ascii字符
        public RequestTemplate matchAsciiUserData(String id) {

            id = id.substring(0, 16);

            Pid_0x01_0 = (byte) 0x03;

            Pid_0x01_1 = (byte) 0x00;

            Pid_0x01_2 = (byte) 0x00;

            Pid_0x01_4_to_n = ByteArrayUtil.asciiStringToBytes(id);

            Pid_0x01_3 = (byte) (Pid_0x01_4_to_n.length * 8);

            return this;
        }

        // 配置匹配写 匹配TID 地址为0 24个Ascii字符
        public RequestTemplate matchTid(String id) {

            id = id.substring(0, 24);

            Pid_0x01_0 = (byte) 0x02;

            Pid_0x01_1 = (byte) 0x00;

            Pid_0x01_2 = (byte) 0x00;

            Pid_0x01_4_to_n = ByteArrayUtil.hexStringToBytes(id);

            Pid_0x01_3 = (byte) (Pid_0x01_4_to_n.length * 8);

            return this;
        }

        // 默认单次写配置 写用户数据区 无匹配 地址为0 16个Ascii字符
        public RequestTemplate standerSingleWrite(String content) {

            Area = (byte) 0x03;

            Address_H = (byte) 0x00;

            Address_L = (byte) 0x00;

            Content = ByteArrayUtil.asciiStringToBytes(content.substring(0, 16));

            return this;
        }
    }
}
